#include "gnuplot.h"
#include "utils.h"

typedef enum
{
    false,
    true
} bool;

/* Génére un graphique pour gnuplot */
void gnuplot(char *NomCapture,char *NomDossier,char *lstProtocoles[][30])
{
    /* Nom des fichiers de sorties */
    char NomFichierCapture[100];
    sprintf(NomFichierCapture,"%s/%s.txt",NomDossier,NomCapture);
    char NomFichierCSV[100];
    sprintf(NomFichierCSV,"%s/%s.csv",NomDossier,NomCapture);
    char NomFichierScript[100];
    sprintf(NomFichierScript,"%s/%s.gnu",NomDossier,NomCapture);
    char NomFichierImage[100];
    sprintf(NomFichierImage,"%s/%s.png",NomDossier,NomCapture);
    
    /* Variables sur les protocoles */
    int nbTotalPaquets=0;
    int ligneProtocoles[3][CompteNbProtocolesMax(lstProtocoles)];
    int totalProtocoles[3][CompteNbProtocolesMax(lstProtocoles)];
    
    /* Intialisation des variables sur les protocoles */
    int m,n;
    for (m=0;m<3;m++)
    {
        n=0;
        while (lstProtocoles[m][n]!=NULL)
        {
            ligneProtocoles[m][n]=0;
            totalProtocoles[m][n]=0;
            n++;
        }
    }
    
    /* Déclarations */
    int i,j;
    char ligne[200];
    int* date_ligne;    // Date courante
    char protocole_ligne[20];
    bool found;
    int last=0;         // Dernière date lu
    
    date_ligne = malloc(sizeof(int));
    memset(protocole_ligne,'\0',20);
    
    FILE *fichierCapture;
    FILE *fichierCSV;
    if ((fichierCapture = fopen(NomFichierCapture, "r")) == NULL)
    {
        printf("Le fichier n'existe pas");
    }
    else
    {
        if ((fichierCSV = fopen(NomFichierCSV, "w")) == NULL)
        {
            printf("Le fichier ne peut pas etre écrit");
        }
        else
        {
            // Début de fichier : Date + nom des potocoles
            fprintf(fichierCSV,"Date");
            for (i=0;i<3;i++)
            {
                fprintf(fichierCSV,";");
                j=0;
                while (lstProtocoles[i][j]!=NULL)
                {
                    fprintf(fichierCSV,";%s",lstProtocoles[i][j]);
                    j++;
                }
            }
            fprintf(fichierCSV,";\n");
            // Nombre de paquets par protocoles et par échelle de temps
            while (fgets(ligne,199,fichierCapture)!=NULL)
            {
                found=false;
                // scan de la ligne
                sscanf(ligne,"%d : %s",date_ligne,protocole_ligne);
                // Nombre de paquets total
                nbTotalPaquets++;
                
                // on écrit la ligne dans le fichier à chaque différente date
                while (last<*date_ligne)
                {
                    fprintf(fichierCSV,"%d",last);
                    for (i=0;i<3;i++)
                    {
                        fprintf(fichierCSV,";");
                        j=0;
                        while (lstProtocoles[i][j]!=NULL)
                        {
                            fprintf(fichierCSV,";%d",ligneProtocoles[i][j]);
                            ligneProtocoles[i][j]=0;
                            j++;
                        }
                    }
                    fprintf(fichierCSV,";\n");
                    last++;
                }
                
                // Je cherche si le paquet de la ligen courante existe
                for (i=0;i<3;i++)
                {
                    j=0;
                    while (lstProtocoles[i][j]!=NULL)
                    {
                        if (strcmp(protocole_ligne,lstProtocoles[i][j])==0)
                        {
                            ligneProtocoles[i][j]++;
                            totalProtocoles[i][j]++;
                            found=true;
                        }
                        j++;
                    }
                }
                if (found==false)
                {
                    //on ignore la ligne !
                }
            }   // pour chaque line du fichier
            
            // on écrit la ligne dans le fichier à la dernière date
            while (last<*date_ligne)
            {
                fprintf(fichierCSV,"%d",last);
                for (i=0;i<3;i++)
                {
                    fprintf(fichierCSV,";");
                    j=0;
                    while (lstProtocoles[i][j]!=NULL)
                    {
                        fprintf(fichierCSV,";%d",ligneProtocoles[i][j]);
                        ligneProtocoles[i][j]=0;
                        j++;
                    }
                }
                fprintf(fichierCSV,";\n");
                last++;
            }
            fprintf(fichierCSV,"\n\n"); // on saute deux lignes
            
            // Fin de fichier : Date + nom des potocoles
            fprintf(fichierCSV,"#TOTAL");
            for (i=0;i<3;i++)
            {
                fprintf(fichierCSV,";");
                j=0;
                while (lstProtocoles[i][j]!=NULL)
                {
                    fprintf(fichierCSV,";%s",lstProtocoles[i][j]);
                    j++;
                }
            }
            fprintf(fichierCSV,";\n");
            
            // Fin de fichier : nombre total des paquets par protocole
            fprintf(fichierCSV,"#");
            for (i=0;i<3;i++)
            {
                fprintf(fichierCSV,"     ;");
                j=0;
                while (lstProtocoles[i][j]!=NULL)
                {
                    fprintf(fichierCSV,";%d",totalProtocoles[i][j]);
                    j++;
                }
            }
            fprintf(fichierCSV,";\n");
            
            fprintf(fichierCSV,"\n"); // on saute une ligne
            // Fin de fichier : Nombre de paquet total
            fprintf(fichierCSV,"#Nombre total de paquets : %d\n",nbTotalPaquets);
            
            fclose(fichierCSV);
        }
        fclose(fichierCapture);
    }
    free(date_ligne);
    
    
    /* Fichier de script pour gnuplot */
    FILE *fichGNUPLOT;
    if ((fichGNUPLOT = fopen(NomFichierScript, "w")) == NULL)
    {
        printf("Le fichier ne peut pas etre écrit");
    }
    else
    {
        fprintf(fichGNUPLOT,"# Graphique\n");
        fprintf(fichGNUPLOT,"set title \"Statistiques   '%s'\"\n",NomCapture);
        fprintf(fichGNUPLOT,"set grid\n");
        fprintf(fichGNUPLOT,"\n");
        fprintf(fichGNUPLOT,"# Données\n");
        fprintf(fichGNUPLOT,"set datafile separator \";\"\n");
        fprintf(fichGNUPLOT,"set datafile commentschars \"#\"\n");
        fprintf(fichGNUPLOT,"plot ");
        int numCol=3;
        bool dejaEcritUneLigne=false;
        for (i=0;i<3;i++)
        {
            j=0;
            while (lstProtocoles[i][j]!=NULL)
            {
                if (totalProtocoles[i][j]>0)
                {
                    if (dejaEcritUneLigne && !(i==0 && j==0)) fprintf(fichGNUPLOT,", \\\n     ");
                    fprintf(fichGNUPLOT,"\"%s\" using 1:%d title columnheader with lines",NomFichierCSV,numCol);//smooth bezier
                    dejaEcritUneLigne=true;
                }
                numCol++;
                j++;
            }
            numCol++;
        }
        fprintf(fichGNUPLOT,"\n\n");
        
        fprintf(fichGNUPLOT,"# Enregistrement en image\n");
        fprintf(fichGNUPLOT,"set term png\n");// size 600, 400
        fprintf(fichGNUPLOT,"set output \"%s\"\n",NomFichierImage);
        fprintf(fichGNUPLOT,"\n");
        fprintf(fichGNUPLOT,"# Affichage du graphique\n");
        fprintf(fichGNUPLOT,"replot\n");
        fprintf(fichGNUPLOT,"set term x11\n");
        fprintf(fichGNUPLOT,"set output\n");
    }
    fclose(fichGNUPLOT);
    
    
    /* J'execute la commande pour lancer le graphique avec gnuplot */
    int pid=fork();
    if (pid==0)     // C'est un autre processus qui éxécute la commande
    {
        char *tab1[]={"gnuplot","-persist",NomFichierScript,NULL};
        int res=execvp("gnuplot",tab1);
        if (res==-1)
        {
            printf("Commande introuvable !\n");
        }
        exit(0);
    }
    else            // Le processus courant attend
    {
        wait(NULL);
    }
    
    
    //ouvrir l'image avec l'application par défaut de l'OS.....
    /*pid=fork();
    if (pid==0)     // C'est un autre processus qui éxécute la commande
    {
        
        char *tab2[]={"xdg-open",NomFichierImage,NULL};
        int res=execvp("xdg-open",tab2);
        if (res==-1)
        {
            printf("Commande introuvable !\n");
        }
        exit(0);
    }
    else            // Le processus courant attend
    {
        wait(NULL);
    }*/
}
